// detach 将主进程关掉 子进程可以自己运行

// unref();

let {spawn} = require('child_process');
let path = require('path');
let fd = require('fs').openSync(path.join(__dirname,'./100.txt'),'w');

let child = spawn('node',['detach.js'],{
  cwd:path.join(__dirname,'test')

  //当使用 detached 选项来启动一个长期运行的进程时，该进程在父进程退出后将不会保持在后台运行，除非提供一个不连接到父进程的 stdio 配置。
  //如果子进程继承自父进程的 stdio ，则子进程将会保持绑定到控制终端(即不会在后台运行)。
  ,stdio:['ignore',fd,'ignore']

  ,detached:true //detached 如果为true,子进程将会成为新的进程组和会话的主导者，当父进程不存在时也可以独立存在；注意即使这里为true，父进程也不会退出，还需要child.unref()
});

child.unref(); //设置detached为true后 还要手动调用下 让父进程可以独立于子进程先退出 除非子进程和父进程之间建立了 IPC 通道。

/*
在 Windows 上，设置 options.detached 为 true 可以使子进程在父进程退出后继续运行。 子进程有自己的控制台窗口。 一旦为子进程启用它，则无法被禁用。

在非 Windows 平台上，如果 options.detached 设为 true，则子进程将会成为新的进程组和会话的主导者。 子进程在父进程退出后可以继续运行，不管它们是否被分离。 详见 setsid(2)。

默认情况下，父进程将会等待被分离的子进程退出。 为了防止父进程等待 subprocess，可以使用 subprocess.unref() 方法。 这样做将会导致父进程的事件循环不会将子进程包含在其引用计数中，使得父进程可以独立于子进程退出，除非子进程和父进程之间建立了 IPC 通道。

当使用 detached 选项来启动一个长期运行的进程时，该进程在父进程退出后将不会保持在后台运行，除非提供一个不连接到父进程的 stdio 配置。 如果父进程的 stdio 是继承的，则子进程将会保持绑定到控制终端。

一个长期运行的进程，为了忽视父进程的终止，通过分离且忽视其父进程的 stdio 文件描述符来实现(即将stdio置为ignore)
，或则也可以将子进程的输出重定向到文件(即在stdio里放打开的文件的fd)
*/
